import { Module } from '@nestjs/common'
import { ConfigService } from '@nestjs/config'
import { TypeOrmModule, type TypeOrmModuleAsyncOptions } from '@nestjs/typeorm'
import { ConfigEnum } from '../enums/config.enum'

@Module({
  imports: [
    TypeOrmModule.forRootAsync({
      useFactory(configService: ConfigService) {
        const DB_CONFIG = configService.get<NestConfig.Database>(ConfigEnum.DATABASE)!
        const option: TypeOrmModuleAsyncOptions = {}
        // 表示要连接的数据库类型，例如 mysql oracle sqlite mongodb
        Reflect.set(option, 'type', 'mysql')
        // 数据库服务器地址
        Reflect.set(option, 'host', DB_CONFIG.host)
        // 数据库服务器端口
        Reflect.set(option, 'port', DB_CONFIG.port)
        // 数据库服务器的用户名
        Reflect.set(option, 'username', DB_CONFIG.username)
        // 数据库服务器的密码
        Reflect.set(option, 'password', DB_CONFIG.password)
        // 表示你需要连接到数据库名
        Reflect.set(option, 'database', DB_CONFIG.database)
        // 表示在应用启动时是否自动创建和更新数据库结构
        Reflect.set(option, 'synchronize', DB_CONFIG.synchronize)
        // 是否需要自动加载实体
        Reflect.set(option, 'autoLoadEntities', true)
        // 时区配置 东八区
        Reflect.set(option, 'timezone', '+08:00')
        // 启用自动重连
        Reflect.set(option, 'reconnect', true)
        // 连接重试之间的延迟（毫秒） (默认值: 3000)
        Reflect.set(option, 'retryDelay', 5 * 1000)
        // 慢查询阈值（毫秒）
        Reflect.set(option, 'maxQueryExecutionTime', 3 * 1000)
        // 尝试连接数据库的次数 (默认值: 10)
        Reflect.set(option, 'retryAttempts', 10)
        // 数据库连接池
        Reflect.set(option, 'poolSize', 10)
        // 显式指定字符集和排序规则
        Reflect.set(option, 'charset', 'utf8mb4_unicode_ci')
        return option
      },
      inject: [ConfigService],
    }),
  ],
})
export class DatabaseModule {}
